﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;

namespace TARLib
{
    public class Prodotto
    {
        public Prodotto(int prodottoID, string nome, string nomeBreve, Decimal prezzoListino, PuntoDistribuzione puntoDiDistribuzione, string codiceProdottoBarcode, bool isLimitato, int percentualeVassoio)
        {
            ProdottoID = prodottoID;
            Nome = nome;
            NomeBreve = nomeBreve;
            PrezzoListino = prezzoListino;
            PuntoDiDistribuzione = puntoDiDistribuzione;
            CodiceProdottoBarcode = codiceProdottoBarcode;
            IsLimitato = isLimitato;
            PercentualeVassoio = percentualeVassoio;
        }

        public int ProdottoID { get; set; }
        public string Nome { get; set; }
        public string NomeBreve { get; set; }
        public Decimal PrezzoListino { get; set; }
        public PuntoDistribuzione PuntoDiDistribuzione { get; set; }
        public string CodiceProdottoBarcode { get; set; }
        public bool IsLimitato { get; set; }
        public int PercentualeVassoio { get; set; }

        public DettagliDisponibilitaProdotto GetDisponibilita()
        {
            DettagliDisponibilitaProdotto retValue;

            SqlConnection conn = new SqlConnection(Database.GetDBConnectionString());
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = "[Cucina].[SP_LimitiProdotto_Par]";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@ProdottoID", System.Data.SqlDbType.Int) { Value = ProdottoID });

            cmd.Parameters.Add(new SqlParameter("@UltimoLimite", System.Data.SqlDbType.Int, 8) { Direction = System.Data.ParameterDirection.Output });
            cmd.Parameters.Add(new SqlParameter("@TimeStampLimite", System.Data.SqlDbType.DateTime) { Direction = System.Data.ParameterDirection.Output });
            cmd.Parameters.Add(new SqlParameter("@InCoda", System.Data.SqlDbType.Int) { Direction = System.Data.ParameterDirection.Output });
            cmd.Parameters.Add(new SqlParameter("@Locked", System.Data.SqlDbType.Int) { Direction = System.Data.ParameterDirection.Output });
            cmd.Parameters.Add(new SqlParameter("@Rimanenti", System.Data.SqlDbType.Int) { Direction = System.Data.ParameterDirection.Output });

            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();

                if (cmd.Parameters["@UltimoLimite"].Value == DBNull.Value)
                {
                    return new DettagliDisponibilitaProdotto(
                        null, null, null, null);
                }
                else
                {
                    retValue = new DettagliDisponibilitaProdotto(
                        (DateTime)cmd.Parameters["@TimeStampLimite"].Value,
                        (int)cmd.Parameters["@UltimoLimite"].Value,
                        (int)cmd.Parameters["@InCoda"].Value,
                        (int)cmd.Parameters["@Locked"].Value);
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
            }

            return retValue;
        }

        public void AggiungiLimite(int? limite, DateTime dataOraLimite)
        {
            SqlConnection conn = new SqlConnection(Database.GetDBConnectionString());
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = conn;
            cmd.CommandText = "[Cucina].[SP_LimiteProdotto_I]";
            cmd.CommandType = System.Data.CommandType.StoredProcedure;
            cmd.Parameters.Add(new SqlParameter("@ProdottoID", System.Data.SqlDbType.Int) { Value = ProdottoID });
            if (limite.HasValue)
            {
                cmd.Parameters.Add(new SqlParameter("@Limite", System.Data.SqlDbType.Int) { Value = limite });
            }
            else
            {
                cmd.Parameters.Add(new SqlParameter("@Limite", System.Data.SqlDbType.Int) { Value = DBNull.Value });
            }
            cmd.Parameters.Add(new SqlParameter("@TimeStamp_Insert", System.Data.SqlDbType.DateTime) { Value = dataOraLimite});
            
            try
            {
                conn.Open();
                cmd.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                cmd.Dispose();
                conn.Close();
                conn.Dispose();
            }
        }
    }
}
